const { Op } = require('sequelize')
const PermissionTemplate = require('../models/PermissionTemplate')
const Department = require('../models/department')
const { validatePermissionTemplate } = require('../utils/validator')
const logger = require('../utils/logger')
const PermissionService = require('../services/permissionService')

// 获取模板列表
exports.getList = async (req, res) => {
  try {
    const templates = await PermissionTemplate.findAll({
      where: { status: 1 },
      order: [['id', 'ASC']]
    })

    res.json({
      code: 200,
      data: templates
    })
  } catch (error) {
    logger.error('Get template list error:', error)
    res.status(500).json({
      code: 500,
      message: '服务器错误'
    })
  }
}

// 创建模板
exports.create = async (req, res) => {
  try {
    // 验证请求数据
    const { error, value } = validatePermissionTemplate(req.body)
    if (error) {
      return res.status(400).json({
        code: 400,
        message: error.details[0].message
      })
    }

    // 检查编码是否已存在
    const exists = await PermissionTemplate.findOne({
      where: { code: value.code }
    })
    if (exists) {
      return res.status(400).json({
        code: 400,
        message: '模板编码已存在'
      })
    }

    // 创建模板
    const template = await PermissionTemplate.create(value)

    res.json({
      code: 200,
      data: template,
      message: '创建成功'
    })
  } catch (error) {
    logger.error('Create template error:', error)
    res.status(500).json({
      code: 500,
      message: '服务器错误'
    })
  }
}

// 更新模板
exports.update = async (req, res) => {
  try {
    const { id } = req.params

    // 验证请求数据
    const { error, value } = validatePermissionTemplate(req.body)
    if (error) {
      return res.status(400).json({
        code: 400,
        message: error.details[0].message
      })
    }

    // 检查模板是否存在
    const template = await PermissionTemplate.findByPk(id)
    if (!template) {
      return res.status(404).json({
        code: 404,
        message: '模板不存在'
      })
    }

    // 检查是否是系统预设模板
    if (template.is_system) {
      return res.status(403).json({
        code: 403,
        message: '系统预设模板不能修改'
      })
    }

    // 检查编码是否已被其他模板使用
    const exists = await PermissionTemplate.findOne({
      where: { 
        code: value.code,
        id: { [Op.ne]: id }
      }
    })
    if (exists) {
      return res.status(400).json({
        code: 400,
        message: '模板编码已存在'
      })
    }

    // 更新模板
    await template.update(value)

    // 清除使用该模板的所有权限缓存
    await PermissionService.clearTemplatePermissionCache(id)

    res.json({
      code: 200,
      data: template,
      message: '更新成功'
    })
  } catch (error) {
    logger.error('Update template error:', error)
    res.status(500).json({
      code: 500,
      message: '服务器错误'
    })
  }
}

// 删除模板
exports.delete = async (req, res) => {
  try {
    const { id } = req.params

    // 检查模板是否存在
    const template = await PermissionTemplate.findByPk(id)
    if (!template) {
      return res.status(404).json({
        code: 404,
        message: '模板不存在'
      })
    }

    // 检查是否是系统预设模板
    if (template.is_system) {
      return res.status(403).json({
        code: 403,
        message: '系统预设模板不能删除'
      })
    }

    // 检查是否有部门在使用该模板
    const usedCount = await Department.count({
      where: { template_id: id }
    })
    if (usedCount > 0) {
      return res.status(400).json({
        code: 400,
        message: '该模板正在被使用，无法删除'
      })
    }

    // 清除使用该模板的所有权限缓存
    await PermissionService.clearTemplatePermissionCache(id)

    // 删除模板
    await template.destroy()

    res.json({
      code: 200,
      message: '删除成功'
    })
  } catch (error) {
    logger.error('Delete template error:', error)
    res.status(500).json({
      code: 500,
      message: '服务器错误'
    })
  }
}

// 获取模板详情
exports.getById = async (req, res) => {
  try {
    const { id } = req.params

    const template = await PermissionTemplate.findByPk(id)
    if (!template) {
      return res.status(404).json({
        code: 404,
        message: '模板不存在'
      })
    }

    res.json({
      code: 200,
      data: template
    })
  } catch (error) {
    logger.error('Get template error:', error)
    res.status(500).json({
      code: 500,
      message: '服务器错误'
    })
  }
} 